/*
20170215 方程的正整数解
方程x1+x2+…+xn=m的正整数解的数量是C(m-1,n-1)个。这个还是比较好理解的。不妨把每个xi看作是相应的xi个1，则所有xi的1个数正好是m个。那么这就相当于一个m个1的字符串序列用n-1个+进行分隔。
如：m=5，n=3。则可以理解为5个1：
11111
用3-1个+分隔。不妨设为如下形式：
1+1+111
这个形式就对应这1+1+3=5这个解。
由于+左右必须有数字1，因此m个1，只有m-1个位置可选。
所以题目变成了从m个1字符串中的m-1个位置选择n-1个放置+号。数量就是C(m-1,n-1)了。
当然现在题目不会这么简单了。题目要求你输出所有的正整数解。
如果解有多个，每个解独占一行，数字之间用空格分开。解之间需要按照字典序进行排列输出。字典序定义如下：如第i行和第j行第一个不相同的数字分别是Xi,k和Xj,k，i<j当且仅当Xi,k<Xj,k。
数据输入只有一行，分别表示m和n。(5<=m<=20,2<=n<=4)
数据输出第一行表示解的个数。然后依次按照字典序输出解。
样例输入：
5 3
输出：
6
1 1 3
1 2 2
1 3 1
2 1 2
2 2 1
3 1 1

*/

#include <iostream>

using namespace std;

void coutX(int m,int n,int j);


int main(void) {

  int m,n;
  cin >> m >> n;
  int c = 1;
  for(int i = n;i <= m-1;i++)
  {
    c= c*i;
  }
  for(int i = 1;i<=m-n;i++)
  {
    c=c/i;
  }

  std::cout << c << '\n';

  coutX(m,n,0);


  return 0;
}

void coutX(int m,int n,int j)
{
   if(n==1)
   {
     cout << m << endl;
     return;
   }
   else
   {
     for (int i = 1; i <= m-1 && m-i >= n-1; i++) {
       std::cout << i << ' ';
       coutX(m-i,n-1,i);
       if(j<=m+j-1 && m>=n-1 && j!= 0 && (i+1 <= m-1 && m-(i+1) >= n-1))  //补充输出，当循环到后期，由第二层开始递归会少输出一次上层递归得到的答案，删除该部分测试即可知
          std::cout << j << ' ';
     }
   }
}
